package ioc

import (
	"fmt"
)

type (
	// 注册 名称:服务
	// 获取 根据名称获取
	IocContainer interface {
		Registry(string, Object)
		//TODO  Get(string) any
		Get(string) Object
		Init() error
	}

	// map类型的ioc
	// 名称:服务
	MapIocContainer struct {
		name    string
		storage map[string]Object
	}

	// 定义为接口 ，实现该接口的方法 就是可以注册到 map ioc
	Object interface {
		Init() error
	}
)

// 实现接口
func (m *MapIocContainer) Registry(name string, obj Object) {
	// 将服务注册到map
	m.storage[name] = obj
}
func (m *MapIocContainer) Get(name string) Object {
	return m.storage[name]
}
func (m *MapIocContainer) Init() error {
	// 遍历 map ioc ，执行每个服务Init()
	if len(m.storage) == 0 {

		return fmt.Errorf("%s %s %s", m.name, m.storage, " IOC为空\n")
		// return errors.New(fmt.Sprintf("%s %s %s", m.name, m.storage, " IOC为空\n"))
	}
	for k, v := range m.storage {
		// 这里的Init 初始化db等
		fmt.Printf("%s %s %v 开始初始化...\n", m.name, k, v)
		if err := v.Init(); err != nil {
			fmt.Printf("%s %s 初始化失败,%v\n", m.name, k, err)
			return err
		}
		fmt.Printf("%s %s %v 初始化成功\n", m.name, k, v)
	}
	return nil

}

// func NewMapIocContainer(name string) IocContainer {
// 	return &MapIocContainer{
// 		storage: make(map[string]Object),
// 	}
// }
// var c IocContainer = NewMapIocContainer("")

var Controller IocContainer = &MapIocContainer{
	name:    "controller",
	storage: map[string]Object{},
}

var Api IocContainer = &MapIocContainer{
	name:    "api",
	storage: map[string]Object{},
}
